#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""检查数据库迁移状态的辅助脚本

用途：
    1. 打印当前数据库连接 URI
    2. 显示 alembic_version 表当前版本号
    3. 扫描 migrations/versions 目录，推断最新(HEAD)修订号
    4. 检查关键表/字段（users.birth_date / users.address）是否存在
    5. 给出是否需要执行 flask db upgrade 的明确提示

使用方式：
    python scripts/check_migration_status.py

前置：
    - 需已安装依赖并可导入 Flask 应用 (backend.create_app)
    - 环境变量 / config.py 中应配置数据库 URI

可集成：
    - CI 中用于在部署前验证迁移是否同步

"""
import os
import sys
import importlib
from pathlib import Path
from typing import Optional
from sqlalchemy import create_engine, text, inspect

PROJECT_ROOT = Path(__file__).resolve().parent.parent
if str(PROJECT_ROOT) not in sys.path:
    sys.path.insert(0, str(PROJECT_ROOT))

# 提前加载 .env（与 create_app 中逻辑保持一致）
try:
    from dotenv import load_dotenv  # type: ignore
    load_dotenv()
except Exception:
    pass

# 优先使用环境变量
DB_URI = os.getenv('DATABASE_URL') or os.getenv('SQLALCHEMY_DATABASE_URI')

# 尝试从 Flask app 里获取（如果未显式提供环境变量）
if not DB_URI:
    try:
        from backend import create_app  # type: ignore
        app = create_app()
        DB_URI = app.config.get('SQLALCHEMY_DATABASE_URI')
    except Exception as e:  # pragma: no cover
        print(f"[WARN] 无法从 Flask 应用获取数据库URI: {e} (可能是 import backend 失败或依赖缺失)")

if not DB_URI:
    print("[FATAL] 未找到数据库连接串，请设置环境变量 DATABASE_URL 或 SQLALCHEMY_DATABASE_URI")
    sys.exit(2)

print(f"[INFO] 数据库 URI: {DB_URI}")

# 构建 SQLAlchemy 引擎
engine = create_engine(DB_URI)

# 1. 读取当前 alembic_version
current_version: Optional[str] = None
try:
    with engine.connect() as conn:
        res = conn.execute(text('SELECT version_num FROM alembic_version'))
        row = res.fetchone()
        if row:
            current_version = row[0]
except Exception as e:
    print(f"[WARN] 读取 alembic_version 失败: {e} (可能是全新库，尚未初始化)")

print(f"[INFO] 当前数据库版本 (alembic_version): {current_version}")

# 2. 扫描 migrations/versions 目录获取所有 revision id
versions_dir = Path(__file__).resolve().parent.parent / 'migrations' / 'versions'
revision_files = []
if versions_dir.is_dir():
    for py in versions_dir.glob('*.py'):
        # 文件名前缀形如 <revision>_xxxx.py
        name = py.name
        if name.startswith('__'):  # 跳过 __pycache__ 里的 .py 可能
            continue
        revision = name.split('_', 1)[0]
        revision_files.append((revision, name))
else:
    print(f"[ERROR] 未找到目录: {versions_dir}")
    sys.exit(2)

revision_files.sort(key=lambda x: x[0])
if revision_files:
    print("[INFO] 发现迁移脚本(按revision排序):")
    for rev, fname in revision_files:
        mark = ' (当前)' if rev == current_version else ''
        print(f"   - {rev} -> {fname}{mark}")
else:
    print("[WARN] 未扫描到任何迁移脚本")

# 3. 推断理论最新版本（最后一个 revision id 元素）
latest_revision = revision_files[-1][0] if revision_files else None
print(f"[INFO] 最新(HEAD) revision: {latest_revision}")

# 4. 检查关键字段是否存在
inspector = inspect(engine)
users_has_birth_date = False
users_has_address = False
if inspector.has_table('users'):
    columns = {c['name'] for c in inspector.get_columns('users')}
    users_has_birth_date = 'birth_date' in columns
    users_has_address = 'address' in columns
    print(f"[CHECK] users 表字段: birth_date={'YES' if users_has_birth_date else 'NO'}, address={'YES' if users_has_address else 'NO'}")
else:
    print("[WARN] 数据库尚无 users 表 (可能是全新库)")

# 5. 状态判定
if not current_version:
    print("[RESULT] 数据库未初始化，应执行: flask db upgrade")
else:
    if latest_revision and current_version != latest_revision:
        print(f"[RESULT] 版本落后: 当前={current_version}, 目标={latest_revision} -> 需要执行: flask db upgrade")
    else:
        print("[RESULT] alembic_version 已是最新")
    if latest_revision and latest_revision.endswith('user_profile_ext') and not (users_has_birth_date and users_has_address):
        print("[RESULT] 注意：用户扩展字段尚未在物理表中出现，可能迁移未成功执行")

print("[DONE] 状态检查完成")
